home *** CD-ROM | disk | FTP | other *** search
Wrap
// Written by Asher Szmulewicz 06/06/2005 ashers@answers.com // ⌐ Copyright Answers Corporation 2005 // All rights reserved // create the base ANSW object if it does not exist. if (typeof ANSW=="undefined") { ANSW = new Object(); } window.addEventListener( "load", function () { // Add a callback to be run every time a document loads. // note that this includes frames/iframes within the document gBrowser.addEventListener("load", ANSW.initLoad, true); }, false ); ANSW.pointedWords = ""; ANSW.fw = 0; ANSW.fc = 0; ANSW.fc_set = false; ANSW.leftbuttondown = false; ANSW.rightbuttondown = false; ANSW.modKey=ANSW.modifierKey.get(); ANSW.tabSelected = function(ev) { if (ANSW.b5) { ANSW.b5.Hide(); delete ANSW.b5; } ANSW.b5 = new ANSW.Balloon(); ANSW.b5.isFirefox=true; //because of Shiretoko ANSW.b5.initBalloon({width:490,autoAway:false}); ANSW.doc= content.document; document.addEventListener("keyup",ANSW.b5.onkeyup,false); }; ANSW.isFirefoxExtension = true; ANSW.initLoad = function(ev) { gBrowser.mTabContainer.addEventListener("select", ANSW.tabSelected, false); var menu = document.getElementById("contentAreaContextMenu"); if (menu!=null) menu.addEventListener("popupshowing", ANSW.contextShowing, false); document.addEventListener("click", ANSW.onClick, true); document.addEventListener("mouseup",ANSW.getWordFromEvent ,true); document.addEventListener("mousedown",ANSW.onMouseDown ,true); document.addEventListener("contextmenu",ANSW.rightClick,true); // document.addEventListener("unload", ANSW.unloadOverlay, false); var myserver = ""; var preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("answers."); if (ANSW.version=="1.0") // from webtip1.js { ANSW.version="2.3.53" ANSW.setStringPreference("version",ANSW.version); } if (preferencesService.prefHasUserValue("server.name")) myserver = preferencesService.getCharPref("server.name"); if (myserver.length>0) ANSW.server = myserver; if (ev.originalTarget.location==content.document.location) { if (ANSW.b5) { ANSW.b5.Hide(); delete ANSW.b5; } ANSW.b5 = new ANSW.Balloon(); ANSW.b5.isFirefox=true; //because of Shiretoko ANSW.b5.initBalloon({width:490,autoAway:false}); ANSW.doc = null; } document.addEventListener("keyup",ANSW.b5.onkeyup,false); }; ANSW.onMouseDown = function(ev) { if (ev[ANSW.modKey] == true) { var altleftclick = true; var preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("answers."); if(preferencesService.prefHasUserValue("action.altclick")) altleftclick = preferencesService.getBoolPref("action.altclick"); if (ev.which == 3 || (ev.which == 1 && altleftclick == true)) // right click or left click { if (ANSW.modKey=="ctrlKey") ANSW.rightbuttondown = true; ev.preventDefault(); ev.stopPropagation(); return false; } } else { if(ANSW.b5.isVisible()) { var el = ev.originalTarget; if (el.id && el.id=="AnswersCloseImage") return true; if (ev.which==3) { var elem = ANSW.b5.getReal(el); if (elem.id == "AnswersBalloon") { ev.preventDefault(); ev.stopPropagation(); return false; } return true; } ANSW.b5.checkDown(ev,el); } } return true; }; ANSW.contextShowing = function() { var menuitem = document.getElementById("oneclick-answers"); if (gContextMenu.isTextSelected) { var text; if (gContextMenu.searchSelected) text = gContextMenu.searchSelected(); else text = getBrowserSelection(); if (text.length > 15) text = text.substr(0,15) + "..."; var displaytext = "Look up \"" + text + "\" on Answers.com"; menuitem.setAttribute("label", displaytext); menuitem.setAttribute("hidden","false"); } else { var displaytext = "Look up on Answers.com"; menuitem.setAttribute("label", displaytext); menuitem.setAttribute("hidden","false"); } }; ANSW.openLink = function(lnk,ev) { action = ANSW.getOptionAction(); var browser = getBrowser(); var ctrlKey = false; var shiftKey = false; if (ev != null) { ctrlKey = ev.ctrlKey; shiftKey = ev.shiftKey; if (ctrlKey == true) action = 3; else if (shiftKey == true) action = 2; else action = 1; } if (action == 3) { var newTab = browser.addTab(lnk); browser.selectedTab = newTab; } else if (action == 1) { window.loadURI(lnk); } else /*if (action == 2) */ { window.open(lnk); } }; ANSW.getOptionAction = function() { var myserver = ""; var prefs = Components.classes["@mozilla.org/preferences-service;1"]. getService(Components.interfaces.nsIPrefBranch); if (ANSW.getFirefoxVersion()< 3) return prefs.getIntPref("browser.link.open_external"); else return prefs.getIntPref("browser.link.open_newwindow"); }; ANSW.lookup = function() { var text = ""; var focusword = false; if (gContextMenu.onTextInput) { text = document.popupNode; text = text.value.substring(text.selectionStart, text.selectionEnd); if (text.length>80) text = text.substr(0,79); } else { if (gContextMenu.searchSelected) text = gContextMenu.searchSelected(); else text = getBrowserSelection(); if (text.length == 0) { focusword = true; text = ANSW.pointedWords; } else if (text.length>80) text = text.substr(0,79); } if (text.length>0) { // urlify and encode utf8 the search string var search = encodeURIComponent(text); var URL = "http://" + ANSW.server + "/main/ntquery?s=" + search; if (focusword) { URL += "&fw=" + ANSW.fw ; URL += "&fc=" + ANSW.fc ; } URL +="&gwp=16"; ANSW.openLink(URL,null); } // re init ANSW.pointedWords=""; ANSW.fw=0; ANSW.fc=0; }; ANSW.onClick = function(ev) { var altleftclick = true; var preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("answers."); if(preferencesService.prefHasUserValue("action.altclick")) altleftclick = preferencesService.getBoolPref("action.altclick"); if(ev.button == 0 && ev[ANSW.modKey] == true && altleftclick == true) { ev.stopPropagation(); ev.preventDefault(); return false; } if(ev.button == 2 && ev[ANSW.modKey] == true) { ev.stopPropagation(); ev.preventDefault(); return false; } return true; }; ANSW.getWordFromEvent = function(ev) { ANSW.b5.moveme_onmouseup(); if (ev[ANSW.modKey] == true) // alt-pressed { // re init ANSW.pointedWords=""; ANSW.fw=0; ANSW.fc=0; var altleftclick = true; var answertip = true; var preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("answers."); if(preferencesService.prefHasUserValue("action.altclick")) altleftclick = preferencesService.getBoolPref("action.altclick"); if(preferencesService.prefHasUserValue("view.answertip")) answertip = preferencesService.getBoolPref("view.answertip"); if (ev.which == 3 || (ev.which == 1 && altleftclick == true)) // right click or left click { ev.stopPropagation(); ev.preventDefault(); var range = document.createRange(); var initialNode = ev.rangeParent; range.selectNode(ev.rangeParent); var rangeOffset = ev.rangeOffset; var netmask_term= ev.originalTarget.getAttribute("netmask_term"); var rngstr=range.toString(); if (ANSW.trim(rngstr).length==0) return; // empty string return var fclist = rngstr.split(/\s+/); var list_length=fclist.length; ANSW.fc=rangeOffset; var fword=fclist.shift(); var fw_pos=0; // focus word position var originalText=ANSW.fw; while (ANSW.fc>fword.length && fword.length>0) { ANSW.fc-=fword.length+1; fword=fclist.shift(); fw_pos++; } fw_pos++; if(ANSW.fc>0) ANSW.fc--; // zero based but don't want -1 happens sometimes if (list_length-fw_pos<3 || fw_pos<3) // less than 3 words around the focus word { var rootnode=initialNode.parentNode.parentNode?initialNode.parentNode.parentNode:initialNode.parentNode; if (netmask_term!=null && netmask_term!="" && rootnode.parentNode) rootnode=rootnode.parentNode.parentNode?rootnode.parentNode.parentNode:rootnode.parentNode; var walker=document.createTreeWalker(rootnode, NodeFilter.SHOW_TEXT, null, false) walker.currentNode = initialNode var origText = walker.currentNode.nodeValue var paratext = ""; var textList=origText.split(/\s+/); while (walker.previousSibling() && textList.length<5){ //Step through each previous sibling paratext=walker.currentNode.nodeValue+paratext textList=paratext.split(/\s+/); } // add original text rangeOffset+= paratext.length; paratext+=origText textList=paratext.split(/\s+/); var origWord=textList.pop(); if (netmask_term!=null && netmask_term!="" && origWord!=originalText) { if (origWord.length>originalText.length) ANSW.fc +=origWord.length+1-originalText.length; else textList.push(origWord); } else textList.push(origWord); var wordNumber= textList.length; // go back to middle walker.currentNode = initialNode while (walker.nextSibling() && textList.length<wordNumber+5){ //Step through each next sibling paratext+=walker.currentNode.nodeValue textList=paratext.split(/\s+/); } rngstr=paratext; } range.detach(); // remove leading white space var nonWS = rngstr.search(/\S/); rngstr = rngstr.substr(nonWS).replace(/(\r|\n)/, " "); rangeOffset -= nonWS; // which word is the focus word - i.e. which word the rangeOffset is in var startstr = rngstr.substring(0, rangeOffset); var endstr = rngstr.substring(rangeOffset, rngstr.length); var wordlist = startstr.split(/\s+/); var wordlist2 = endstr.split(/\s+/); if (wordlist.length > 4) wordlist = wordlist.slice(wordlist.length-4); if (wordlist2.length > 5) wordlist2 = wordlist2.slice(0, 4); rngstr = wordlist.join(" ") + wordlist2.join(" "); iStartWord = wordlist.length - 1; var text = rngstr; ANSW.fw=iStartWord; if (text.length>80) text = text.substr(0,79); if (text.length>0) { if (answertip == true) { ANSW.leftbuttondown = true; var el = ev.originalTarget; var elem = ANSW.getLastParent(el); var top = ev.pageY ; var left = ev.pageX ; var ad = content.document.getElementsByTagName("IFRAME"); if (ad.length>0) // IFRAMES { var tmp =el; while (tmp != null && tmp.nodeType != 9) { tmp = tmp.parentNode; } for(var i=0;i<ad.length;i++) { if (tmp.location==ad[i].src) { var temp= ad[i]; var offsetTop = 0; var offsetLeft = 0; while(temp) { offsetTop += temp.offsetTop; offsetLeft += temp.offsetLeft; temp=temp.offsetParent; } top +=offsetTop; left += offsetLeft; } } } if (elem!=null && elem.tagName=="window") { ANSW.pointedWords=""; ANSW.fw=0; ANSW.fc=0; ANSW.fc_set=false; return false; } if(ANSW.b5.isVisible()) { elem = ANSW.b5.getReal(el); if (elem.id == "AnswersBalloon") { top = -1; left = -1; } } if (elem.nodeName!="BODY") elem = null; ANSW.b5.FireQuery(text,top,left,ANSW.fw,elem,null,null,ANSW.fc); } else { // urlify and encode utf8 the search string var search = encodeURIComponent(text); var URL = "http://" + ANSW.server + "/main/ntquery?s=" + search + "&fw=" + ANSW.fw + "&fc=" + ANSW.fc +"&gwp=16"; ANSW.openLink(URL,ev); } } // re init ANSW.pointedWords=""; ANSW.fw=0; ANSW.fc=0; ANSW.fc_set=false; return false; } } else if (ev.which == 3)// right click { // re init ANSW.pointedWords=""; ANSW.fw=0; ANSW.fc=0; ANSW.fc_set= false; if(ANSW.b5.isVisible()) { var el = ev.originalTarget; var elem = ANSW.b5.getReal(el); if (elem.id == "AnswersBalloon") { ev.preventDefault(); ev.stopPropagation(); return false; } } var range = document.createRange(); range.setStart(ev.rangeParent, ev.rangeOffset); range.setEnd(ev.rangeParent, ev.rangeOffset); ANSW.expandRangeToWords(range,true,2,2); range.detach(); return false; } return true; }; ANSW.expandRangeToWords = function(range,left2right,previous,next) { var startOfWord = /^\s\S+$/; var endOfWord = /^\S+\s$/; var whitespace = /^\s+$/; var dir = 1; if (left2right == false) dir = -1; // right to left var i = 1; var previous_at_start = previous; var next_at_start = next; // if offset is inside whitespace try { range.setStart(range.startContainer, range.startOffset - 1); } catch(e) { previous =0; next = 0; return; } if (range.toString().length == 0) // empty range return; while (whitespace.test(range.toString())) { try { range.setEnd(range.endContainer, range.endOffset + dir); range.setStart(range.startContainer, range.startOffset + dir); } catch(e) { previous =0; next = 0; return; } } if (range.toString().length == 0) // empty range after whitespace return; var fc_end = 0; while (!startOfWord.test(range.toString())) { try { if (dir == 1 && ANSW.fc == 0) { ANSW.fc = range.startOffset; } range.setStart(range.startContainer, range.startOffset - 1); if (ANSW.fc_set == false) { fc_end = range.startOffset; } if (range.startOffset == 0) { if (range.toString().charAt(0)=='\n') { if (previous==previous_at_start) { ANSW.fc_set = true; fc_end = 1; ANSW.fc -= fc_end; } range.setStart(range.startContainer, range.startOffset+1); } i=0; previous = 0; break; } } catch(e) { i = 0; previous = 0; break; } } if (range.toString().length == 0) // empty range after startOfWord return; if (dir == 1 && ANSW.fc_set == false) { ANSW.fc_set = true; ANSW.fc -= fc_end; } if (i==1 && previous!=0 && next!=0) { ANSW.fw++; previous--; var prevrange = range.cloneRange(); prevrange.setEnd(prevrange.endContainer,range.startOffset); ANSW.expandRangeToWords (prevrange,false,previous,next); ANSW.pointedWords += " "; prevrange.detach(); } range.setStart(range.startContainer, range.startOffset + i); while (!endOfWord.test(range.toString())) { try { range.setEnd(range.endContainer, range.endOffset + 1); } catch(e) { ANSW.pointedWords += range.toString(); next = 0; return; } } range.setEnd(range.endContainer, range.endOffset - 1); ANSW.pointedWords += range.toString(); if (left2right && next>0) { next--; var nextrange = range.cloneRange(); ANSW.pointedWords += " "; try { nextrange.setEnd(nextrange.endContainer,range.endOffset + 2); nextrange.setStart(nextrange.startContainer,range.endOffset+1); } catch(e) { next = 0; return; } ANSW.expandRangeToWords (nextrange,true,0,next); ANSW.pointedWords += " "; nextrange.detach(); } }; /*ANSW.unloadOverlay =function () // from twoElls { //Get various things needed to deal with RDF. var RDFService = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService); var Container = Components.classes["@mozilla.org/rdf/container;1"].getService(Components.interfaces.nsIRDFContainer); var extensionDS= Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager).datasource; //Get nodes and arc needed to figure out whether the given extension is slated to be uninstalled. var root = RDFService.GetResource("urn:mozilla:extension:root"); var nameArc = RDFService.GetResource("http://www.mozilla.org/2004/em-rdf#name"); var toBeUninstalledArc = RDFService.GetResource("http://www.mozilla.org/2004/em-rdf#toBeUninstalled"); Container.Init(extensionDS,root); //Now iterate over the elements to find the toBeUninstalled value for the extension in question var found = false; var elements = Container.GetElements(); while (elements.hasMoreElements()) { var element = elements.getNext().QueryInterface(Components.interfaces.nsIRDFResource); var name = ""; var toBeUninstalled = ""; var target = extensionDS.GetTarget(element, nameArc ,true); if (target) { name = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value; } target = extensionDS.GetTarget(element, toBeUninstalledArc ,true); if (target) { toBeUninstalled=target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value; } //If we find the right value, set the found flag to true. if (toBeUninstalled && (toBeUninstalled == "true") && (name == "Answers")) { found = true; } } //Ok, our extension is slated to be uninstalled, so do some more stuff. if(found==true) { try { //Get the localstore datasource var ds=new RDFDataSource("rdf:local-store"); //Get the sidebar-box node. var node=ds.getNode("chrome://browser/content/browser.xul#sidebar-box"); //Get that nodeÆs properties and remove all targets, which typically include "src," "width," and "sidebarcommand" //Removing all properties apparently causes the node itself to be deleted, which is the result weÆre actually going for. var properties=node.getProperties(); while(properties.hasMoreElements()) { prop=properties.getNext(); var target = node.getTarget(prop.getValue()); node.removeTarget(prop.getValue(),target); } //Now save and refresh the datasource. ds.save(); ds.refresh(); // reset to default=true the Answers prefs var preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch(""); if(preferencesService.prefHasUserValue("answers.action.altclick")) { preferencesService.setBoolPref("answers.action.altclick", true); } if(preferencesService.prefHasUserValue("answers.view.answertip")) { preferencesService.setBoolPref("answers.view.answertip", true); } } catch(e) { } } };*/ ANSW.rightClick = function(ev) { var el = ev.originalTarget; var elem = ANSW.b5.getReal(el); if (elem.id == "AnswersBalloon" || ANSW.rightbuttondown==true) { ANSW.rightbuttondown = false; if (ANSW.modKey=="ctrlKey") { ev.preventDefault(); ev.stopPropagation(); return false; } return true; } return true; }; ANSW.getLastParent = function(el) { var temp = el; while ((temp != null) && (temp.tagName != "BODY") && (temp.tagName != "window")) { temp = temp.parentNode; } return temp; }; // Sets a string preference ANSW.setStringPreference = function(preference, value) { var preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("answers."); // If the preference is set if(preference && preferencesService) { var supportsStringInterface = Components.interfaces.nsISupportsString; var string = Components.classes["@mozilla.org/supports-string;1"].createInstance(supportsStringInterface); string.data = value; preferencesService.setComplexValue(preference, supportsStringInterface, string); } }; ANSW.getFirefoxVersion = function(){ var userAgent = navigator.userAgent.toLowerCase(); var index = userAgent.lastIndexOf("/")+1; return index==0?0:userAgent.charAt(index); };